package com.blackhorse.zuul.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

//自定义的zuul过滤器
@Component
public class LoginFilter extends ZuulFilter {
    //定义过滤类型：pre，routing，post，error
    @Override
    public String filterType() {
        return "pre";
    }

    //指定过滤器的执行顺序，返回值越小，执行顺序越高
    @Override
    public int filterOrder() {
        return 1;
    }

    //当前过滤器是否生效，true：使用此过滤器，false：不使用此过滤器
    @Override
    public boolean shouldFilter() {
        return true;
    }

    //指定过滤器真正处理的业务逻辑
    /**
     * 身份认证：
     * 1.所有的请求需要携带一个参数：access-token
     * 2.获取request请求
     * 3.穷国request获取参数
     * 4.判断token是否为null
     * 只要token不为空就通过身份验证
     * 在zuul网关，通过RequestContext的上下文对象，可以获取request
     *
     * @return Object
     * @throws ZuulException 异常
     */
    @Override
    public Object run() throws ZuulException {
        System.out.println("执行登录过滤...");
        //1.获取zuul提供的上下文对象RequestContext
        RequestContext ctx = RequestContext.getCurrentContext();
        //2.从RequestContext中获取request
        HttpServletRequest request = ctx.getRequest();
        //3.获取请求参数access-token
        String token = request.getParameter("access-token");
        //4.判断
        if (token == null) {
            //4.1 如果token==null，拦截请求，返回认证失败
            ctx.setSendZuulResponse(false);//拦截请求
            ctx.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());//返回响应码401，表示身份未认证
        }
        //4.2 如果token!=null，继续后续操作
        return null;
    }
}
